﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

namespace Csharp_Study
{
    class Program02
    {

        //    //----------------------------------------------迭代器(C#)----------------------------------------------

        //    static void Main(string[] args)
        //    {
        //        //DaysOfTheWeek days = new DaysOfTheWeek();

        //        //foreach (string day in days)
        //        //{
        //        //    Console.Write(day + " ");
        //        //}

        //        //IEnumerable<String> days1 = new DaysOfTheWeek();

        //        //foreach (string day in days1)
        //        //{
        //        //    Console.Write(day + " ");
        //        //}

        //        DaysOfTheWeek days2 = new DaysOfTheWeek();

        //        foreach (string day in days2.GetEnumerator2)
        //        {
        //            Console.Write(day + " ");
        //        }

        //        // Output: Sun Mon Tue Wed Thu Fri Sat
        //        Console.ReadKey();
        //    }
        //}


        //public class DaysOfTheWeek : IEnumerable<String>
        //{
        //    private string[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };

        //    public IEnumerator GetEnumerator()
        //    {
        //        for (int index = 0; index < days.Length; index++)
        //        {
        //            // Yield each day of the week.
        //            yield return days[index];
        //        }
        //    }

        //    IEnumerator<String> IEnumerable<String>.GetEnumerator()
        //    {
        //        for (int index = 0; index < days.Length; index++)
        //        {
        //            // Yield each day of the week.
        //            yield return days[index];
        //        }
        //    }

        //    public IEnumerable GetEnumerator2
        //    {
        //       get{
        //            for (int index = 0; index < days.Length; index++)
        //            {
        //                // Yield each day of the week.
        //                yield return days[index];
        //            }
        //        }

        //    }



        //----------------------------------------------对泛型列表使用迭代器(C#)----------------------------------------------

        //static void Main()
        //{

        //    Stack<int> theStack = new Stack<int>();

        //    //  Add items to the stack.
        //    for (int number = 0; number <= 9; number++)
        //    {
        //        theStack.Push(number);
        //    }

        //    // Retrieve items from the stack.
        //    // foreach is allowed because theStack implements IEnumerable<int>.
        //    foreach (int number in theStack)
        //    {
        //        Console.Write("{0} ", number);
        //    }
        //    Console.WriteLine();
        //    // Output: 9 8 7 6 5 4 3 2 1 0

        //    // foreach is allowed, because theStack.TopToBottom returns IEnumerable(Of Integer).
        //    foreach (int number in theStack.TopToBottom)
        //    {
        //        Console.Write("{0} ", number);
        //    }
        //    Console.WriteLine();
        //    // Output: 9 8 7 6 5 4 3 2 1 0

        //    foreach (int number in theStack.BottomToTop)
        //    {
        //        Console.Write("{0} ", number);
        //    }
        //    Console.WriteLine();
        //    // Output: 0 1 2 3 4 5 6 7 8 9

        //    foreach (int number in theStack.TopN(7))
        //    {
        //        Console.Write("{0} ", number);
        //    }
        //    Console.WriteLine();
        //    // Output: 9 8 7 6 5 4 3

        //    Console.ReadKey();
        //}

        public class Stack<T> : IEnumerable<T>
        {
            private T[] values = new T[100];
            private int top = 0;

            public void Push(T t)
            {
                values[top] = t;
                top++;
            }
            public T Pop()
            {
                top--;
                return values[top];
            }

            // This method implements the GetEnumerator method. It allows
            // an instance of the class to be used in a foreach statement.
            public IEnumerator<T> GetEnumerator()
            {
                for (int index = top - 1; index >= 0; index--)
                {
                    yield return values[index];
                }
            }

            IEnumerator IEnumerable.GetEnumerator()
            {
                for (int index = top - 1; index >= 0; index--)
                {
                    yield return values[index];
                }
            }

            // 迭代器可用作一种方法，或一个 get 访问器
            // 这里作为属性，一定要加上get
            public IEnumerable<T> TopToBottom
            {
                get { return this; }
            }

            //迭代器可用作一种方法，或一个 get 访问器
            // 这里作为属性，一定要加上get
            public IEnumerable<T> BottomToTop
            {
                get
                {
                    for (int index = 0; index <= top - 1; index++)
                    {
                        yield return values[index];
                    }
                }
            }

            public IEnumerable<T> TopN(int itemsFromTop)
            {
                // Return less than itemsFromTop if necessary.
                int startIndex = itemsFromTop >= top ? 0 : top - itemsFromTop;

                for (int index = top - 1; index >= startIndex; index--)
                {
                    yield return values[index];
                }
            }

        }


    }
}
